package com.yue.yadmin.service.imp;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.yue.yadmin.enums.EnumMenuType;
import com.yue.yadmin.mapper.SysMenuMapper;
import com.yue.yadmin.model.SysMenu;
import com.yue.yadmin.model.SysMenuDto;
import com.yue.yadmin.model.SysMenuDto2;
import com.yue.yadmin.service.SysMenuService;
import com.yue.yadmin.utils.ShiroUtils;

import tk.mybatis.mapper.entity.Example;

@Service
public class SysMenuServiceImpl extends BaseServiceImpl<SysMenu> implements SysMenuService{
	@Autowired
	SysMenuMapper sysMenuMapper;
	@Override
	public SysMenuDto2 getCurrentUserMenuList(){
		SysMenuDto2 sysMenuDto2 = new SysMenuDto2();
		List<SysMenu> sysMenus = getList();
		//map{key(menuId):value(positon)} positon：对应list的序列,多层级用“_”分割
		Map<Long, String> menuIndexMap = new HashMap<Long, String>();
		String splitStr = "_";
		List<SysMenuDto> sysMenuDtos = new ArrayList<SysMenuDto>();
		for(int i=0,total=sysMenus.size();i<total;i++){
			SysMenu sysMenu = sysMenus.get(i);
			//权限不为空且登录用户没有对应权限的直接过滤
			if(StringUtils.isNotBlank(sysMenu.getPermission())&&!ShiroUtils.hasPermission(sysMenu.getPermission()))continue;
			//剩下的即为有权限或者无需权限的菜单、按钮，封装
			if(EnumMenuType.MENU.getType()==sysMenu.getType()){
				//一级菜单为0
				if(sysMenu.getParentId()==0){
					menuIndexMap.put(sysMenu.getId(), ""+sysMenuDtos.size());
					sysMenuDtos.add(new SysMenuDto(sysMenu, new ArrayList<SysMenuDto>()));
				}else{
					String indexStr = menuIndexMap.get(sysMenu.getParentId());
					if(StringUtils.isBlank(indexStr))continue;
					String[] indexs = indexStr.split(splitStr);
					List<SysMenuDto> lastSubMenuList = null;
					for(int num=0,all=indexs.length;num<all;num++){
						if(num==0)lastSubMenuList = sysMenuDtos;
						lastSubMenuList = lastSubMenuList.get(Integer.parseInt(indexs[num])).getSubMenus();
					}
					menuIndexMap.put(sysMenu.getId(), String.format("%s_%s", indexStr,lastSubMenuList.size()));
					lastSubMenuList.add(new SysMenuDto(sysMenu, new ArrayList<SysMenuDto>()));
				}
			}else if(EnumMenuType.BUTTON.getType()==sysMenu.getType()){
				sysMenuDto2.addButton(sysMenu);
			}
		}
		for(SysMenuDto sysMenuDto:sysMenuDtos){
			if(sysMenuDto.getSubMenus().size()>0) sysMenuDto2.addMenu(sysMenuDto);
		}
		return sysMenuDto2;
	}
	@Override
	public List<SysMenu> getPermissionMenus() {
		List<SysMenu> sysMenus = getList();
		List<SysMenu> sysMenus_ = new ArrayList<SysMenu>();
		Map<Long,String> menuPermissionMap = new HashMap<Long, String>();
		for(int i=0,total=sysMenus.size();i<total;i++){
			SysMenu sysMenu = sysMenus.get(i);
			if(StringUtils.isNoneBlank(sysMenu.getUrl())){
				String permission = sysMenu.getPermission();
				String parentPermissioin = menuPermissionMap.get(sysMenu.getParentId());
				if(StringUtils.isNotBlank(parentPermissioin)){
					sysMenu.setPermission(StringUtils.isBlank(permission)?parentPermissioin:String.format("%s,%s", sysMenu.getPermission(),parentPermissioin));
				}
				if(StringUtils.isNotBlank(sysMenu.getPermission())){
					sysMenus_.add(sysMenu);
					menuPermissionMap.put(sysMenu.getId(), sysMenu.getPermission());
				}
			}
		}
		return sysMenus_;
	}
	
	@Override
	public List<SysMenu> getList() {
		Example example = createExample();
		example.setOrderByClause("parent_id asc ,order_num desc");
		return selectList(example);
	}
	
	public static void main(String[] args) throws IllegalAccessException, InvocationTargetException {
//		TreeMap<String, Boolean> treeMap = new TreeMap<String, Boolean>();
//		treeMap.put("5_4", true);
//		treeMap.put("2_4", true);
//		treeMap.put("5_5", true);
//		treeMap.put("7_4", true);
//		for(String key:treeMap.descendingKeySet()){
//			System.out.println(key);
//		}
//		long b = System.currentTimeMillis();
//		SysMenu sysMenu =  new SysMenu();
//		sysMenu.setId(1l);
//		sysMenu.setName("test");
//		SysMenuDto sysMenu1 =  new SysMenuDto();
//		BeanUtils.copyProperties(sysMenu1, sysMenu);
//		long e = System.currentTimeMillis();
//		System.out.println(sysMenu1);
//		System.out.println(e-b);
		String str = "1_2";
		String[] strs = str.split("_");
		System.out.println(strs[0]);
	}
}
